﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Joel.Vishnu.Repositorios;
using Joel.Vishnu.Modelo.Entidades;
using Joel.Vishnu.Modelo.Enumeradores;
using Joel.Vishnu.Presentacion.Vistas;

namespace Joel.Vishnu.Presentacion
{
    public class EmpleadosPresentador
    {
        #region Constructores

        public EmpleadosPresentador(IEmpleados vista)
        {
            this.vista = vista;
        }

        #endregion

        #region Atributos

        IEmpleados vista;

        #endregion

        #region Propiedades

        private RepositorioEmpleado RepositorioEmpleado
        {
            get { return new RepositorioEmpleado(); }
        }

        private RepositorioBarrio RepositorioBarrio
        {
            get { return new RepositorioBarrio(); }
        }

        private RepositorioGenero RepositorioGenero
        {
            get { return new RepositorioGenero(); }
        }

        private RepositorioEstadoCivil RepositorioEstadoCivil
        {
            get { return new RepositorioEstadoCivil(); }
        }

        #endregion

        #region Metodos

        public void Aceptar()
        {
            if (vista.Nombre == String.Empty)
                throw new Exception("El nombre no puede quedar vacio.");
            if (vista.Apellido == String.Empty)
                throw new Exception("El apellido no puede quedar vacio.");
            if (vista.Dni == 0)
                throw new Exception("El DNI no puede quedar vacio.");
            if (Convert.ToString(vista.Dni).Length < 8)
                throw new Exception("El DNI no puede quedar incompleto.");
            if (vista.Telefono == String.Empty)
                throw new Exception("El teléfono no puede quedar vacio.");
            if (vista.Direccion == String.Empty)
                throw new Exception("La direccion no puede quedar vacia.");
            var barrio = RepositorioBarrio.DevolverPorId(vista.BarrioId);
            if (barrio == null)
                throw new Exception("El barrio no existe.");
            if (vista.Email == String.Empty)
                throw new Exception("El email no puede quedar vacio.");
            var genero = RepositorioGenero.DevolverPorId(vista.GeneroId);
            if (genero == null)
                throw new Exception("El género no existe.");
            if (vista.FechaContratacion > DateTime.Now)
                throw new Exception("La fecha de contratacion no puede ser mayor a la fecha actual.");
            if (vista.FechaCumpleanos > DateTime.Now.AddYears(-18))
                throw new Exception("El empleado no puede ser menor a 18 años");
            var estadoCivil = RepositorioEstadoCivil.DevolverPorId(vista.EstadoCivilId);
            if (estadoCivil == null)
                throw new Exception("El estado civil no existe.");
            if (vista.ContactoEmergenciaNombre == String.Empty)
                throw new Exception("El nombre del contacto de emergencia no puede quedar vacio.");
            if (vista.ContactoEmergenciaTelefono == String.Empty)
                throw new Exception("El teléfono del contacto de emergencia no puede quedar vacio.");
            if (vista.Salario == 0)
                throw new Exception("El Salario no puede quedar vacio.");
            switch (vista.Estado)
            {
                case EnumEstado.NUEVO:
                    {
                        Empleado empleado = new Empleado();
                        empleado.Nombre = vista.Nombre;
                        empleado.Apellido = vista.Apellido;
                        empleado.Dni = vista.Dni;
                        empleado.Telefono = vista.Telefono;
                        empleado.Direccion = vista.Direccion;
                        empleado.Barrio = barrio;
                        empleado.Email = vista.Email;
                        empleado.Genero = genero;
                        empleado.FechaContratacion = vista.FechaContratacion;
                        empleado.FechaCumpleanos = vista.FechaCumpleanos;
                        empleado.EstadoCivil = estadoCivil;
                        empleado.ContactoEmergenciaNombre = vista.ContactoEmergenciaNombre;
                        empleado.ContactoEmergenciaTelefono = vista.ContactoEmergenciaTelefono;
                        empleado.Salario = vista.Salario;
                        RepositorioEmpleado.Insertar(empleado);
                        break;
                    }
                case EnumEstado.MODIFICAR:
                    {
                        if (vista.EmpleadoId == (Int32)EnumEmpleados.EMPLEADO_POR_DEFECTO)
                            throw new Exception("No se puede modificar un empleado por defecto.");
                        Empleado empleado = RepositorioEmpleado.DevolverPorId(vista.EmpleadoId);
                        if (empleado == null)
                            throw new Exception("El empleado no existe.");
                        empleado.Nombre = vista.Nombre;
                        empleado.Apellido = vista.Apellido;
                        empleado.Dni = vista.Dni;
                        empleado.Telefono = vista.Telefono;
                        empleado.Direccion = vista.Direccion;
                        empleado.Barrio = barrio;
                        empleado.Email = vista.Email;
                        empleado.Genero = genero;
                        empleado.FechaContratacion = vista.FechaContratacion;
                        empleado.FechaCumpleanos = vista.FechaCumpleanos;
                        empleado.EstadoCivil = estadoCivil;
                        empleado.ContactoEmergenciaNombre = vista.ContactoEmergenciaNombre;
                        empleado.ContactoEmergenciaTelefono = vista.ContactoEmergenciaTelefono;
                        empleado.Salario = vista.Salario;
                        RepositorioEmpleado.Modificar(empleado);
                        break;
                    }
            }
            vista.ListaEmpleados = RepositorioEmpleado.DevolverTodos();
        }

        public void Eliminar()
        {
            if (vista.EmpleadoId == (Int32)EnumEmpleados.EMPLEADO_POR_DEFECTO)
                throw new Exception("No se puede eliminar un empleado por defecto.");
            Empleado empleado = RepositorioEmpleado.DevolverPorId(vista.EmpleadoId);
            if (empleado == null)
                throw new Exception("El empleado no existe.");
            RepositorioEmpleado.Eliminar(empleado);
            vista.ListaEmpleados = RepositorioEmpleado.DevolverTodos();
        }

        public void ActualizarEstadosCiviles()
        {
            vista.ListaEstadosCiviles = (from item in RepositorioEstadoCivil.DevolverTodos()
                                         orderby item.Nombre ascending
                                         select item).ToList();
        }

        public void ActualizarBarrios()
        {
            vista.ListaBarrios = (from item in RepositorioBarrio.DevolverTodos()
                                  orderby item.Nombre ascending
                                  select item).ToList();
        }

        public void ActualizarEmpleados()
        {
            vista.ListaEmpleados = (from item in RepositorioEmpleado.DevolverTodos()
                                    orderby item.ApellidoNombre ascending
                                    select item).ToList();
        }

        public void Inicialiar()
        {
            ActualizarEstadosCiviles();
            ActualizarBarrios();
            ActualizarEmpleados();
        }

        public Barrio TraerBarrioPorId(Int32 barrioId)
        {
            Barrio entidad = RepositorioBarrio.DevolverPorId(barrioId);
            return entidad;
        }

        public EstadoCivil TraerEstadoCivilPorId(Int32 estadoCivilId)
        {
            EstadoCivil entidad = RepositorioEstadoCivil.DevolverPorId(estadoCivilId);
            return entidad;
        }

        #endregion
    }
}